package apigateway.project.commen.config;

import lombok.Data;

import java.io.Serializable;
import java.util.Map;

@Data
public class Rule implements Serializable {

    /**
     * 规则id
     */
    private String id;

    /**
     * 规则名称
     */
    private String name;

    /**
     * 后端服务名称
     */
    private String serviceName;

    /**
     * 断言
     */
    private Map<String, String> predicates;
    /**
     * 过滤器信息
     * 过滤器id,过滤器配置
     */
    private Map<String,String> filters;
    /**
     * 重试规则
     */
    private RetryConfig retryConfig = new RetryConfig();

    private FlowConfig flowConfig = new FlowConfig();

    @Data
    public static class RetryConfig{
        private int maxAttempts;
    }

    /**
     * 流控规则
     */
    @Data
    public static class FlowConfig{
        //是基于qps还是线程数
        private String type;
        //阈值
        private int count;
        //进入流控的处理策略
        private String strategy;
    }

    /**
     * 熔断规则
     */
    private HystrixConfig hystrixConfig;

    /**
     * 熔断规则(sentinel)
     */
    private CircuitBreakerConfig breakerConfig;
    @Data
    public static class CircuitBreakerConfig{
        /**
         * 慢调用比例模式下为慢调用临界 RT（超出该值计为慢调用）；异常比例/异常数模式下为对应的阈值
         */
        private int count;
        /**
         * 熔断时长，单位为 s
         */
        private int timeWindow;
        /**
         * 慢调用比例阈值，仅慢调用比例模式有效（1.8.0 引入）
         */
        private float slowRatioThreshold;
        /**
         * 熔断触发的最小请求数，请求数小于该值时即使异常比率超出阈值也不会熔断
         * 默认值为 5
         */
        private int minRequestAmount = 5;
        /**
         * 统计时长（单位为 ms），如 60*1000 代表分钟级
         * 默认值为 1000 ms
         */
        private int statIntervalMs = 1000;
        /**
         * 其它熔断降级响应
         */
        private String fallbackResponse = "服务熔断,请稍后再试!";
    }
    @Data
    public static class HystrixConfig{

        /**
         * 超时时间
         */
        private int timeoutInMilliseconds;

        /**
         * 核心线程数量
         */
        private int threadCoreSize;

        /**
         * 熔断降级响应
         */
        private String fallbackResponse;
    }

    /**
     * 负载均衡规则
     */
    private LoadBalanceConfig loadBalanceConfig;
    @Data
    public static class LoadBalanceConfig {

        /**
         *
         */
        private String config;


        @Override
        public boolean equals(Object o) {
            if (this == o) {
                return true;
            }

            if ((o == null) || getClass() != o.getClass()) {
                return false;
            }
            Rule rule = new Rule();
            LoadBalanceConfig that = (LoadBalanceConfig) o;
            return rule.id.equals(that.getId());
        }
        public String getId(){
            return new Rule().getId();
        }
    }


        /**
     * redis实现熔断配置
     */
    private RedisCircuitBreakerConfig circuitBreakerConfig;
    @Data
    public static class RedisCircuitBreakerConfig{
        //慢调用临界 RT（超出该值计为慢调用）
        int count;
        //熔断时长，单位为 s
        int timeWindow;
        //熔断触发的最小请求数
        int minRequestAmount;
        //统计时长（单位为 ms）
        int statIntervalMs;
        //慢调用比例阈值
        int slowRatioThreshold;

        /**
         * 其它熔断降级响应
         */
        private String fallbackResponse = "服务熔断,请稍后再试!";
    }

}
